﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using Microsoft.Owin.Security.OAuth;
using Newtonsoft.Json.Serialization;
using System.Web.Http.Cors;
using WebApiThrottle;
using HCQ2_Model.ViewModel.WebAPI;
using HCQ2_Common.Constant;
using HCQ2WebAPI_Logic.Filters;

namespace HCQ2WebAPI
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //1.通过反射解决MVC、Web Api类名不能相同的问题
            //var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix",
            //    System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
            //suffix?.SetValue(null, "ApiController");

            //配置跨域请求
            //config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

            // Web API 配置和服务
            // 将 Web API 配置为仅使用不记名令牌身份验证。
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // json数据格式配置 Camel格式（驼峰）
            //var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            //jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

            // Web API 路由
            config.MapHttpAttributeRoutes();

            //配置
            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional });

            #region Web Api 接口请求限制 1
            //[EnableThrottling(PerMinute = 12)]//控制访问频率，每分钟最多12次
            //[DisableThrotting] //不须要控制访问频率的能够不加或者加上
            config.Filters.Add(new CustomThrottlingFilter()
            {
                Policy = new ThrottlePolicy()
                {
                    //ip配置区域
                    IpThrottling = true,
                    ClientThrottling = true

                    //端点限制策略配置会从EnableThrottling特性中获取。
                    //EndpointThrottling = true
                },
                QuotaExceededContent = (l, obj) =>  //违反限流事件
                {  
                    var json = new { errcode = 101, errmsg = $"系统检测您当前违反限流约定，请不要频繁操作稍后再试！，{l}/{obj}", value = "" };
                    return (json);
                }
            });
            #endregion

            #region Web Api 接口请求限制 2
            //config.MessageHandlers.Add(new ThrottlingHandler()
            //{
            //    Policy = new ThrottlePolicy(
            //           perSecond: 5            //可选参数 每秒限制次数 5
            //         , perMinute: 20         //可选参数 每分钟限制次数 20
            //         , perHour: 200          //可选参数 每小时限制次数
            //         , perDay: 1500          //可选参数 每天限制次数
            //         , perWeek: 3000         //可选参数 每周限制次数
            //         )
            //    {
            //        IpThrottling = true,   //该值指示是否启用IP限制
            //        ClientThrottling = true //该值指示是否启用客户端限制
            //    },
            //    Repository = new CacheRepository(), //获取或设置限制度量存储。
            //                                        //QuotaExceededMessage = JsonConvert.SerializeObject(json.msg),
            //    QuotaExceededContent = (l, obj) =>  //违反限流事件
            //    {  //API calls quota exceeded! maximum      admitted {0} per {1} 
            //        var json = new WebApiResultJsonModel { errcode = WebResultCode.Exception, errmsg = $"系统检测您当前操作非人类，{l}/{obj}", value = string.Empty };
            //        return (json);
            //    }
            //});
            #endregion
        }
    }
}
